package com.xxmw.transaction.model.app;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 订单基类
 * @author luowenliang
 * @since 2020/2/11 09:46
 */
@Data
public class BourseOrder {

    protected Long id;

    /**
     * 订单交易类型 sell卖 buy买
     * buy-market市价买 buy-limit限价买
     * sell-market市价买 sell-limit限价卖
     * {@link com.xxmw.transaction.enumeration.TradeTypeEnum}
     */
    protected Integer tradeType;

    /**
     * 交易所订单号
     */
    protected String outId;

    /**
     * 交易所
     * 详情看 {@link com.xxmw.transaction.enumeration.BourseEnum}
     */
    protected Integer bourse;

    /**
     * 交易对 btcusdt
     */
    protected String symbol;

    /**
     * 基础币种
     */
    protected String baseCurrency;

    /**
     * 报价币种
     */
    protected String quoteCurrency;

    /**
     * 交易数量 btc数量
     */
    protected BigDecimal num;

    /**
     * 交易价格 usdt数量
     */
    protected BigDecimal price;

    /**
     * 成交数量
     */
    protected BigDecimal dealNum;

    /**
     * 成交均价
     */
    protected BigDecimal avgPrice;

    /**
     * 手续费
     */
    protected BigDecimal fee;

    /**
     * 订单总价 num*price
     */
    protected BigDecimal totalPrice;

    /**
     * 下单时交易所买一价
     */
    protected BigDecimal bid;

    /**
     * 下单时交易所卖一价
     */
    protected BigDecimal ask;

    /**
     * 订单状态 0初始订单 1已提交 2撤销中 3部分成交 4部分成交已撤销 5已撤销 6已成交 7挂单失败
     */
    protected Integer status = Status.CREATED.value;

    /**
     * 备注信息 记录交易所非异常下单失败返回的结果
     */
    protected String remark;

    /**
     * 创建时间
     */
    protected Date created;

    /**
     * 成交时间
     */
    private Date dealTime;

    /**
     * 订单状态枚举类
     */
    public enum Status {
        /**
         * 初始订单
         */
        CREATED(0,"初始订单"),
        /**
         * 已提交
         */
        PUBLISHED(1,"已提交"),
        /**
         * 取消中
         */
        CANCELING(2,"取消中"),
        /**
         * 部分成交
         */
        DEAL_PART(3,"部分成交"),
        /**
         * 部分成交已取消
         */
        CANCEL_PART(4,"部分成交已取消"),
        /**
         * 已撤销
         */
        CANCLED(5,"已撤销"),
        /**
         * 已成交
         */
        DEALED(6,"已成交"),
        /**
         * 挂单失败
         */
        PUBLISH_ERROR(7,"挂单失败"),
        HEDGING(8, "已对冲");

        private Integer value;

        private String msg;

        Status (Integer value, String msg) {
            this.msg = msg;
            this.value = value;
        }

        public Integer value () {
            return this.value;
        }

        public String msg () {
            return this.msg;
        }
    }
}
